package com.didd.core.common.base;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;

/**
 * dubbo全局返回Response
 *
 * @author diddd
 * @date 2019/06/24
 */
@Getter
@ToString
@NoArgsConstructor
public class RpcResponse<T> implements Serializable {

    /**
     * 请求响应码
     */
    private int code;
    /**
     * 请求响应状态
     */
    private String status;
    /**
     * 请求响应消息
     */
    private String message;
    /**
     * 泛型业务对象
     */
    private T data;

    /**
     * 私有构造方法
     *
     * @param status 异常枚举
     */
    private RpcResponse(ResultStatus status) {
        this.code = status.fetchCode();
        this.status = status.fetchStatus();
        this.message = status.fetchMessage();
    }

    /**
     * 私有构造方法
     *
     * @param status 异常枚举
     * @param data   返回对象
     */
    private RpcResponse(ResultStatus status, T data) {
        this.code = status.fetchCode();
        this.status = status.fetchStatus();
        this.message = status.fetchMessage();
        this.data = data;
    }

    /**
     * 私有构造方法
     *
     * @param status  异常枚举
     * @param message 返回对象
     */
    private RpcResponse(ResultStatus status, String message) {
        this.code = status.fetchCode();
        this.status = status.fetchStatus();
        this.message = message;
    }

    /**
     * 私有构造方法
     *
     * @param status  异常枚举
     * @param message 返回对象
     */
    private RpcResponse(ResultStatus status, String message, T data) {
        this.code = status.fetchCode();
        this.status = status.fetchStatus();
        this.message = message;
        this.data = data;
    }

    /**
     * 成功
     *
     * @return 'RpcResponse(code=1, status=success, message=success, data=null)'
     */
    public static <T> RpcResponse<T> success() {
        return new RpcResponse<>(ResultCode.SUCCESS);
    }

    /**
     * 成功
     *
     * @return 'RpcResponse(code=1, status=success, message=system error, data=object)'
     */
    public static <T> RpcResponse<T> success(T data) {
        return new RpcResponse<>(ResultCode.SUCCESS, data);
    }

    /**
     * 成功
     *
     * @return 'RpcResponse(code=1, status=success, message=自定义消息, data=null)'
     */
    public static <T> RpcResponse<T> successMessage(String message) {
        return new RpcResponse<>(ResultCode.SUCCESS, message);
    }

    /**
     * 成功
     *
     * @return 'RpcResponse(code=1, status=success, message=自定义消息, data=object)'
     */
    public static <T> RpcResponse<T> success(T data, String message) {
        return new RpcResponse<>(ResultCode.SUCCESS, message, data);
    }

    /**
     * 失败
     *
     * @param status 自定义异常枚举
     * @return 'RpcResponse(code=1, status=fail, message=system error, data=object)'
     */
    public static <T> RpcResponse<T> fail(ResultStatus status) {
        return new RpcResponse<>(status);
    }

    /**
     * 失败
     *
     * @param message 失败信息
     * @return 'RpcResponse(code=1, status=fail, message=system error, data=object)'
     */
    public static <T> RpcResponse<T> fail(String message) {
        return new RpcResponse<>(ResultCode.FAIL_BIZ, message);
    }

    /**
     * 失败
     *
     * @param status 自定义异常枚举
     * @param data   自定义返回对象
     * @return 'RpcResponse(code=1, status=fail, message=system error, data=object)'
     */
    public static <T> RpcResponse<T> fail(ResultStatus status, T data) {
        return new RpcResponse<>(status, data);
    }

    /**
     * 请求成功
     *
     * @return true 成功
     */
    public boolean hasSuccess() {
        return this.code == 0;
    }

    /**
     * 请求失败
     *
     * @return true 失败
     */
    public boolean hasFail() {
        return this.code != 0;
    }

    /**
     * set方法可以重写返回的异常消息
     *
     * @param message 消息内容
     */
    public void setMessage(String message) {
        this.message = message;
    }
}
